import re
import streamlit as st
from services.db import init_db
from services.auth import create_user, login_user
from ui.styles import apply_global_styles
from config.matplotlib_config import apply_matplotlib_cn


init_db()
apply_matplotlib_cn()

# 页面配置
st.set_page_config(
    page_title="机器学习算法学习平台",
    page_icon="🧠",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 应用样式
apply_global_styles()

# 会话状态管理
if 'logged_in' not in st.session_state:
    st.session_state.logged_in = False
if 'username' not in st.session_state:
    st.session_state.username = None
if 'register' not in st.session_state:
    st.session_state.register = False

# 侧边栏认证
st.sidebar.title("🧠 机器学习算法学习平台")

if not st.session_state.logged_in:
    if st.session_state.register:
        st.sidebar.subheader("创建新账户")
        new_username = st.sidebar.text_input("用户名", key="new_username")
        new_password = st.sidebar.text_input("密码", type="password", key="new_password")
        confirm_password = st.sidebar.text_input("确认密码", type="password", key="confirm_password")

        if st.sidebar.button("注册"):
            if not new_username or not new_password:
                st.sidebar.error("用户名和密码不能为空")
            elif new_password != confirm_password:
                st.sidebar.error("密码不匹配")
            elif len(new_password) < 4:
                st.sidebar.error("密码长度至少为4个字符")
            elif not re.match("^[a-zA-Z0-9_]+$", new_username):
                st.sidebar.error("用户名只能包含字母、数字和下划线")
            else:
                if create_user(new_username, new_password):
                    st.sidebar.success("注册成功！请登录")
                    st.session_state.register = False
                else:
                    st.sidebar.error("用户名已存在")

        if st.sidebar.button("返回登录"):
            st.session_state.register = False
    else:
        st.sidebar.subheader("登录")
        username = st.sidebar.text_input("用户名")
        password = st.sidebar.text_input("密码", type="password")

        if st.sidebar.button("登录"):
            if login_user(username, password):
                st.session_state.logged_in = True
                st.session_state.username = username
                st.sidebar.success(f"欢迎回来, {username}!")
                st.rerun()
            else:
                st.sidebar.error("用户名或密码不正确")

        if st.sidebar.button("注册新账户"):
            st.session_state.register = True
else:
    st.sidebar.success(f"{st.session_state.username} 已登录")
    if st.sidebar.button("退出登录"):
        st.session_state.logged_in = False
        st.session_state.username = None
        st.rerun()


# 主页
st.markdown('<h1 class="main-header">机器学习算法学习平台</h1>', unsafe_allow_html=True)

if st.session_state.logged_in:
    st.markdown(f"""
    <div>
        <p style='font-size: 1.2rem;'>欢迎回来, {st.session_state.username}！本平台提供了多种常用机器学习算法的学习资源，包括算法原理讲解、代码示例和交互式演示。</p>
    </div>
    """, unsafe_allow_html=True)
else:
    st.markdown("""
    <div>
        <p style='font-size: 1.2rem;'>欢迎来到机器学习算法学习平台！本平台提供了多种常用机器学习算法的学习资源，包括算法原理讲解、代码示例和交互式演示。</p>
        <p style='font-size: 1.2rem; color: #ff4b4b;'>请先登录以访问所有功能。</p>
    </div>
    """, unsafe_allow_html=True)

col1, col2, col3 = st.columns(3)

with col1:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>KNN算法</h3>
        <p>K最近邻(K-Nearest Neighbors)是一种基本的分类与回归方法。</p>
    </div>
    """, unsafe_allow_html=True)

with col2:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>线性回归</h3>
        <p>利用回归方程对一个或多个自变量和因变量之间关系进行建模的一种分析方式。</p>
    </div>
    """, unsafe_allow_html=True)

with col3:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>逻辑回归</h3>
        <p>用于解决二分类问题的机器学习方法，用于估计某种事物的可能性。</p>
    </div>
    """, unsafe_allow_html=True)

col4, col5, col6 = st.columns(3)

with col4:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>随机森林</h3>
        <p>包含多个决策树的分类器，其输出的类别是由个别树输出的类别的众数而定。</p>
    </div>
    """, unsafe_allow_html=True)

with col5:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>朴素贝叶斯</h3>
        <p>基于贝叶斯定理和特征条件独立假设的分类方法。</p>
    </div>
    """, unsafe_allow_html=True)

with col6:
    st.markdown("""
    <div class='algorithm-card'>
        <h3>更多功能</h3>
        <p>代码示例、可视化展示、交互式演示</p>
    </div>
    """, unsafe_allow_html=True)

st.markdown("---")
if st.session_state.logged_in:
    st.markdown("### 🚀 开始学习")
    st.markdown("请使用左侧菜单进入各算法页面：KNN算法、线性回归、逻辑回归、随机森林、朴素贝叶斯。")
else:
    st.markdown("### 🔐 请先登录")
    st.markdown("请使用左侧边栏登录或注册账户以访问所有学习内容。")

# 脚页
st.markdown("---")
st.markdown(
    "<div style='text-align: center; color: gray;'>机器学习算法学习平台 © 2025</div>",
    unsafe_allow_html=True
)
